home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 2003 August / MW 8 2003 CD1.iso / Inside Macworld / Product News / gimp-1.2.4.sit / gimp-1.2.4 / plug-ins / imagemap / imap_preferences.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-11-29  |  19.6 KB  |  629 lines

  1. /*
  2.  * This is a plug-in for the GIMP.
  3.  *
  4.  * Generates clickable image maps.
  5.  *
  6.  * Copyright (C) 1998-1999 Maurits Rijk  lpeek.mrijk@consunet.nl
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21.  *
  22.  */
  23.  
  24. #include "config.h"
  25.  
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29.  
  30. #include "imap_command.h"
  31. #include "imap_file.h"
  32. #include "imap_main.h"
  33. #include "imap_menu.h"
  34. #include "imap_misc.h"
  35. #include "imap_mru.h"
  36. #include "imap_preferences.h"
  37. #include "imap_table.h"
  38.  
  39. #include "libgimp/gimp.h"
  40. #include "libgimp/stdplugins-intl.h"
  41.  
  42. static gint
  43. parse_map_type(void)
  44. {
  45.    char *token = strtok(NULL, " )");
  46.    if (!strcmp(token, "ncsa"))
  47.       return NCSA;
  48.    else if (!strcmp(token, "cern"))
  49.       return CERN;
  50.    return CSIM;
  51. }
  52.  
  53. static gint
  54. parse_yes_no(void)
  55. {
  56.    char *token = strtok(NULL, " )");
  57.    return (gint) strcmp(token, "no");
  58. }
  59.  
  60. static gint
  61. parse_int(void)
  62. {
  63.    char *token = strtok(NULL, " )");
  64.    return (gint) atoi(token);
  65. }
  66.  
  67. static void
  68. parse_color(GdkColor *gdk_color)
  69. {
  70.    gint color[3];
  71.  
  72.    color[0] = parse_int();
  73.    color[1] = parse_int();
  74.    color[2] = parse_int();
  75.  
  76.    gdk_color->red = (guint16) color[0];
  77.    gdk_color->green = (guint16) color[1];
  78.    gdk_color->blue = (guint16) color[2];
  79. }
  80.  
  81. static void
  82. parse_mru_entry(void)
  83. {
  84.    char *filename = strtok(NULL, " )");
  85.    mru_add(get_mru(), filename);
  86. }
  87.  
  88. static void
  89. parse_line(PreferencesData_t *data, char *line)
  90. {
  91.    char *token;
  92.    ColorSelData_t *colors = &data->colors;
  93.  
  94.    line++;            /* Skip '(' */
  95.    token = strtok(line, " ");
  96.  
  97.    if (!strcmp(token, "default-map-type")) {
  98.       data->default_map_type = parse_map_type();
  99.    }else if (!strcmp(token, "prompt-for-area-info")) {
  100.       data->prompt_for_area_info = parse_yes_no();
  101.    } else if (!strcmp(token, "require-default-url")) {
  102.       data->require_default_url = parse_yes_no();
  103.    } else if (!strcmp(token, "show-area-handle")) {
  104.       data->show_area_handle = parse_yes_no();
  105.    } else if (!strcmp(token, "keep-circles-round")) {
  106.       data->keep_circles_round = parse_yes_no();
  107.    } else if (!strcmp(token, "show-url-tip")) {
  108.       data->show_url_tip = parse_yes_no();
  109.    } else if (!strcmp(token, "use-doublesized")) {
  110.       data->use_doublesized = parse_yes_no();
  111.    } else if (!strcmp(token, "mru-size")) {
  112.       data->mru_size = parse_int();
  113.    } else if (!strcmp(token, "undo-levels")) {
  114.       data->undo_levels = parse_int();
  115.    } else if (!strcmp(token, "normal-fg-color")) {
  116.       parse_color(&colors->normal_fg);
  117.    } else if (!strcmp(token, "normal-bg-color")) {
  118.       parse_color(&colors->normal_bg);
  119.    } else if (!strcmp(token, "selected-fg-color")) {
  120.       parse_color(&colors->selected_fg);
  121.    } else if (!strcmp(token, "selected-bg-color")) {
  122.       parse_color(&colors->selected_bg);
  123.    } else if (!strcmp(token, "mru-entry")) {
  124.       parse_mru_entry();
  125.    } else {
  126.       /* Unrecognized, just ignore rest of line */
  127.    }
  128. }
  129.  
  130. gboolean
  131. preferences_load(PreferencesData_t *data)
  132. {
  133.    FILE *in;
  134.    char buf[256];
  135.    gchar *filename;
  136.  
  137.    filename = g_strconcat (gimp_directory(), 
  138.                            G_DIR_SEPARATOR_S, "imagemaprc", NULL);
  139.  
  140.    in = fopen(filename, "r");
  141.    g_free(filename);
  142.    if (in) {
  143.       while (fgets(buf, sizeof(buf), in)) {
  144.      if (*buf != '\n' && *buf != '#') {
  145.         parse_line(data, buf);
  146.      }
  147.       }
  148.       fclose(in);
  149.       return TRUE;
  150.    }
  151.    return FALSE;
  152. }
  153.  
  154. void
  155. preferences_save(PreferencesData_t *data)
  156. {
  157.    FILE *out;
  158.    gchar *filename;
  159.    ColorSelData_t *colors = &data->colors;
  160.  
  161.    filename = g_strconcat (gimp_directory (), 
  162.                            G_DIR_SEPARATOR_S, "imagemaprc", NULL);
  163.  
  164.    out = fopen(filename, "w");
  165.    if (out) {
  166.       fprintf(out, "# Imagemap plug-in resource file\n\n");
  167.       if (data->default_map_type == NCSA)
  168.      fprintf(out, "(default-map-type ncsa)\n");
  169.       else if (data->default_map_type == CERN)
  170.      fprintf(out, "(default-map-type cern)\n");
  171.       else
  172.      fprintf(out, "(default-map-type csim)\n");
  173.  
  174.       fprintf(out, "(prompt-for-area-info %s)\n",
  175.           (data->prompt_for_area_info) ? "yes" : "no");
  176.       fprintf(out, "(require-default-url %s)\n",
  177.           (data->require_default_url) ? "yes" : "no");
  178.       fprintf(out, "(show-area-handle %s)\n",
  179.           (data->show_area_handle) ? "yes" : "no");
  180.       fprintf(out, "(keep-circles-round %s)\n",
  181.           (data->keep_circles_round) ? "yes" : "no");
  182.       fprintf(out, "(show-url-tip %s)\n",
  183.           (data->show_url_tip) ? "yes" : "no");
  184.       fprintf(out, "(use-doublesized %s)\n",
  185.           (data->use_doublesized) ? "yes" : "no");
  186.  
  187.       fprintf(out, "(undo-levels %d)\n", data->undo_levels);
  188.       fprintf(out, "(mru-size %d)\n", data->mru_size);
  189.  
  190.       fprintf(out, "(normal-fg-color %d %d %d)\n",
  191.           colors->normal_fg.red, colors->normal_fg.green, 
  192.           colors->normal_fg.blue);
  193.       fprintf(out, "(normal-bg-color %d %d %d)\n",
  194.           colors->normal_bg.red, colors->normal_bg.green, 
  195.           colors->normal_bg.blue);
  196.       fprintf(out, "(selected-fg-color %d %d %d)\n",
  197.           colors->selected_fg.red, colors->selected_fg.green, 
  198.           colors->selected_fg.blue);
  199.       fprintf(out, "(selected-bg-color %d %d %d)\n",
  200.           colors->selected_bg.red, colors->selected_bg.green, 
  201.           colors->selected_bg.blue);
  202.  
  203.       mru_write(get_mru(), out);
  204.  
  205.       fclose(out);
  206.    } else {
  207.       do_file_error_dialog( _("Couldn't save resource file:"), filename);
  208.    }
  209.    g_free(filename);
  210. }
  211.  
  212. static void
  213. preferences_ok_cb(gpointer data)
  214. {
  215.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  216.    PreferencesData_t *old_data = param->old_data;
  217.    ColorSelData_t *colors = &old_data->colors;
  218.    MRU_t *mru = get_mru();
  219.  
  220.    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->cern)))
  221.       old_data->default_map_type = CERN;
  222.    else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->ncsa)))
  223.       old_data->default_map_type = NCSA;
  224.    else
  225.       old_data->default_map_type = CSIM;
  226.  
  227.    old_data->prompt_for_area_info = gtk_toggle_button_get_active(
  228.       GTK_TOGGLE_BUTTON(param->prompt_for_area_info));
  229.    old_data->require_default_url = gtk_toggle_button_get_active(
  230.       GTK_TOGGLE_BUTTON(param->require_default_url));
  231.    old_data->show_area_handle = gtk_toggle_button_get_active(
  232.       GTK_TOGGLE_BUTTON(param->show_area_handle));
  233.    old_data->keep_circles_round = gtk_toggle_button_get_active(
  234.       GTK_TOGGLE_BUTTON(param->keep_circles_round));
  235.    old_data->show_url_tip = gtk_toggle_button_get_active(
  236.       GTK_TOGGLE_BUTTON(param->show_url_tip));
  237.    old_data->use_doublesized = gtk_toggle_button_get_active(
  238.       GTK_TOGGLE_BUTTON(param->use_doublesized));
  239.  
  240.    old_data->mru_size = 
  241.       gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->mru_size));
  242.    old_data->undo_levels = 
  243.       gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->undo_levels));
  244.    mru_set_size(mru, old_data->mru_size);
  245.    menu_build_mru_items(mru);
  246.    command_list_set_undo_level(old_data->undo_levels);
  247.  
  248.    *colors = param->new_colors;
  249.  
  250.    gdk_gc_set_foreground(old_data->normal_gc, &colors->normal_fg);
  251.    gdk_gc_set_background(old_data->normal_gc, &colors->normal_bg);
  252.    gdk_gc_set_foreground(old_data->selected_gc, &colors->selected_fg);
  253.    gdk_gc_set_background(old_data->selected_gc, &colors->selected_bg);
  254.  
  255.    set_sash_size(old_data->use_doublesized);
  256.    redraw_preview();
  257. }
  258.  
  259. static void
  260. set_button_colors(PreferencesDialog_t *dialog, ColorSelData_t *colors)
  261. {
  262.    gdk_window_set_background(dialog->normal_fg->window, 
  263.                  &colors->normal_fg);
  264.    gdk_window_clear(dialog->normal_fg->window);
  265.    gdk_window_set_background(dialog->normal_bg->window, 
  266.                  &colors->normal_bg);
  267.    gdk_window_clear(dialog->normal_bg->window);
  268.    gdk_window_set_background(dialog->selected_fg->window, 
  269.                  &colors->selected_fg);
  270.    gdk_window_clear(dialog->selected_fg->window);
  271.    gdk_window_set_background(dialog->selected_bg->window, 
  272.                  &colors->selected_bg);
  273.    gdk_window_clear(dialog->selected_bg->window);
  274. }
  275.  
  276. static void
  277. select_color_cancel(GtkWidget *widget, gpointer data)
  278. {
  279.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  280.    gtk_widget_hide(param->color_sel_dlg);
  281.    set_button_colors(param, ¶m->old_colors);
  282. }
  283.  
  284. static void
  285. select_color_ok(GtkWidget *widget, gpointer data)
  286. {
  287.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  288.    param->old_colors = param->new_colors;
  289.    gtk_widget_hide(param->color_sel_dlg);
  290. }
  291.  
  292. static void (*_color_changed_func)(GtkWidget *widget, gpointer data);
  293.  
  294. static void
  295. color_changed(GtkWidget *widget, gpointer data)
  296. {
  297.    (*_color_changed_func)(widget, data);
  298. }
  299.  
  300. static void
  301. change_color(PreferencesDialog_t *param, GtkWidget *button, 
  302.          GdkColor *gdk_color)
  303. {
  304.    gdouble color[3];
  305.    GdkColormap *colormap;
  306.    GtkColorSelection *colorsel = GTK_COLOR_SELECTION(param->color_sel);
  307.  
  308.    gtk_color_selection_get_color(colorsel, color);
  309.    
  310.    gdk_color->red = (guint16)(color[0]*65535.0);
  311.    gdk_color->green = (guint16)(color[1]*65535.0);
  312.    gdk_color->blue = (guint16)(color[2]*65535.0);
  313.  
  314.    colormap = gdk_window_get_colormap(button->window);
  315.    gdk_color_alloc(colormap, gdk_color);
  316.    gdk_window_set_background(button->window, gdk_color);
  317.    gdk_window_clear(button->window);
  318. }
  319.  
  320. static void
  321. normal_fg_color_changed(GtkWidget *widget, gpointer data)
  322. {
  323.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  324.    change_color(param, param->normal_fg, ¶m->new_colors.normal_fg);
  325. }
  326.  
  327. static void
  328. normal_bg_color_changed(GtkWidget *widget, gpointer data)
  329. {
  330.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  331.    change_color(param, param->normal_bg, ¶m->new_colors.normal_bg);
  332. }
  333.  
  334. static void
  335. selected_fg_color_changed(GtkWidget *widget, gpointer data)
  336. {
  337.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  338.    change_color(param, param->selected_fg, ¶m->new_colors.selected_fg);
  339. }
  340.  
  341. static void
  342. selected_bg_color_changed(GtkWidget *widget, gpointer data)
  343. {
  344.    PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  345.    change_color(param, param->selected_bg, ¶m->new_colors.selected_bg);
  346. }
  347.  
  348. static gint
  349. area_event(GtkWidget *widget, GdkEvent *event, PreferencesDialog_t *param,
  350.        GdkColor *gdk_color, 
  351.        void (*color_changed_func)(GtkWidget *widget, gpointer data))
  352. {
  353.    gdouble color[3];
  354.  
  355.    if (event->type != GDK_BUTTON_PRESS)
  356.       return FALSE;
  357.  
  358.    if (!param->color_sel_dlg) {
  359.       GtkWidget *dialog = gtk_color_selection_dialog_new( _("Select Color"));
  360.  
  361.       param->color_sel_dlg = dialog;
  362.  
  363.       param->color_sel = GTK_COLOR_SELECTION_DIALOG(
  364.      param->color_sel_dlg)->colorsel;
  365.    
  366.       gtk_signal_connect(GTK_OBJECT(param->color_sel), "color_changed", 
  367.              (GtkSignalFunc)color_changed, (gpointer) param);
  368.  
  369.       gtk_signal_connect(
  370.      GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(dialog)->ok_button), 
  371.      "clicked", GTK_SIGNAL_FUNC(select_color_ok), (gpointer) param);
  372.  
  373.       gtk_signal_connect(
  374.      GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(dialog)->cancel_button), 
  375.      "clicked", GTK_SIGNAL_FUNC(select_color_cancel), (gpointer) param);
  376.  
  377.    }
  378.  
  379.    _color_changed_func = color_changed_func;
  380.  
  381.    color[0] = (gdouble) gdk_color->red / 65535.0;
  382.    color[1] = (gdouble) gdk_color->green / 65535.0;
  383.    color[2] = (gdouble) gdk_color->blue / 65535.0;
  384.    gtk_color_selection_set_color(GTK_COLOR_SELECTION(param->color_sel), color);
  385.  
  386.    gtk_widget_show(param->color_sel_dlg);
  387.    return TRUE;
  388. }
  389.  
  390. static gint
  391. edit_normal_fg(GtkWidget *widget, GdkEvent *event, PreferencesDialog_t *param)
  392. {
  393.    return area_event(widget, event, param, ¶m->old_data->colors.normal_fg,
  394.              normal_fg_color_changed);
  395. }
  396.  
  397. static gint
  398. edit_normal_bg(GtkWidget *widget, GdkEvent *event, PreferencesDialog_t *param)
  399. {
  400.    return area_event(widget, event, param, ¶m->old_data->colors.normal_bg,
  401.              normal_bg_color_changed);
  402. }
  403.  
  404. static gint
  405. edit_selected_fg(GtkWidget *widget, GdkEvent *event, 
  406.          PreferencesDialog_t *param)
  407. {
  408.    return area_event(widget, event, param, 
  409.              ¶m->old_data->colors.selected_fg,
  410.              selected_fg_color_changed);
  411. }
  412.  
  413. static gint
  414. edit_selected_bg(GtkWidget *widget, GdkEvent *event, 
  415.          PreferencesDialog_t *param)
  416. {
  417.    return area_event(widget, event, param, 
  418.              ¶m->old_data->colors.selected_bg,
  419.              selected_bg_color_changed);
  420. }
  421.  
  422. static void
  423. create_general_tab(PreferencesDialog_t *data, GtkWidget *notebook)
  424. {
  425.    GtkWidget *table;
  426.    GtkWidget *frame;
  427.    GtkWidget *hbox;
  428.    GSList    *group;
  429.    GtkWidget *label;
  430.  
  431.    table = gtk_table_new(7, 2, FALSE);
  432.    gtk_container_set_border_width(GTK_CONTAINER(table), 10);
  433.    gtk_table_set_row_spacings(GTK_TABLE(table), 10);
  434.    gtk_table_set_col_spacings(GTK_TABLE(table), 10);
  435.    gtk_widget_show(table);
  436.  
  437.    frame = gtk_frame_new( _("Default Map Type"));
  438.    gtk_widget_show(frame);
  439.    gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 2, 0, 1);
  440.    hbox = gtk_hbox_new(FALSE, 1);
  441.    gtk_container_add(GTK_CONTAINER(frame), hbox);
  442.    gtk_widget_show(hbox);
  443.    data->ncsa = gtk_radio_button_new_with_label(NULL, "NCSA");
  444.    gtk_box_pack_start(GTK_BOX(hbox), data->ncsa, TRUE, TRUE, 10);
  445.    gtk_widget_show(data->ncsa);
  446.    group = gtk_radio_button_group(GTK_RADIO_BUTTON(data->ncsa));
  447.    data->cern = gtk_radio_button_new_with_label(group, "CERN");
  448.    gtk_box_pack_start(GTK_BOX(hbox), data->cern, TRUE, TRUE, 10);
  449.    gtk_widget_show(data->cern);
  450.    group = gtk_radio_button_group(GTK_RADIO_BUTTON(data->cern));
  451.    data->csim = gtk_radio_button_new_with_label(group, "CSIM");
  452.    gtk_box_pack_start(GTK_BOX(hbox), data->csim, TRUE, TRUE, 10);
  453.    gtk_widget_show(data->csim);
  454.  
  455.    data->prompt_for_area_info = 
  456.       create_check_button_in_table(table, 1, 0, _("Prompt for area info"));
  457.    data->require_default_url = 
  458.       create_check_button_in_table(table, 2, 0, _("Require default URL"));
  459.    data->show_area_handle = 
  460.       create_check_button_in_table(table, 3, 0, _("Show area handles"));
  461.    data->keep_circles_round = 
  462.       create_check_button_in_table(table, 4, 0, _("Keep NCSA circles true"));
  463.    data->show_url_tip =
  464.       create_check_button_in_table(table, 5, 0, _("Show area URL tip"));
  465.    data->use_doublesized = 
  466.       create_check_button_in_table(table, 6, 0,
  467.                    _("Use double-sized grab handles"));
  468.    gtk_widget_show(frame);
  469.  
  470.    label = gtk_label_new( _("General"));
  471.    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label);
  472. }
  473.  
  474. static void
  475. create_menu_tab(PreferencesDialog_t *data, GtkWidget *notebook)
  476. {
  477.    GtkWidget *table;
  478.    GtkWidget *label;
  479.    GtkWidget *vbox;
  480.  
  481.    vbox = gtk_vbox_new(FALSE, 1);
  482.    gtk_widget_show(vbox);
  483.  
  484.    table = gtk_table_new(2, 2, FALSE);
  485.    gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
  486.    gtk_container_set_border_width(GTK_CONTAINER(table), 10);
  487.    gtk_table_set_row_spacings(GTK_TABLE(table), 10);
  488.    gtk_table_set_col_spacings(GTK_TABLE(table), 10);
  489.    gtk_widget_show(table);
  490.  
  491.    create_label_in_table(table, 0, 0, _("Number of Undo levels (1 - 99):"));
  492.    data->undo_levels = create_spin_button_in_table(table, 0, 1, 1, 1, 99);
  493.  
  494.    create_label_in_table(table, 1, 0, _("Number of MRU entries (1 - 16):"));
  495.    data->mru_size = create_spin_button_in_table(table, 1, 1, 1, 1, 16);
  496.  
  497.    label = gtk_label_new( _("Menu"));
  498.    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
  499. }
  500.  
  501. static GtkWidget*
  502. create_color_field(PreferencesDialog_t *data, GtkWidget *table, gint row, 
  503.            gint col, GtkSignalFunc func)
  504. {
  505.    GtkWidget *area = gtk_drawing_area_new();
  506.  
  507.    gtk_drawing_area_size(GTK_DRAWING_AREA(area), 16, 8);
  508.    gtk_widget_set_events(area, GDK_BUTTON_PRESS_MASK);
  509.    gtk_table_attach_defaults(GTK_TABLE(table), area, col, col + 1, row, 
  510.                  row + 1);
  511.    gtk_signal_connect(GTK_OBJECT(area), "event", func, (gpointer) data);
  512.    gtk_widget_show(area);
  513.  
  514.    return area;
  515. }
  516.  
  517. static void
  518. create_colors_tab(PreferencesDialog_t *data, GtkWidget *notebook)
  519. {
  520.    GtkWidget *table, *label;
  521.    GtkWidget *vbox;
  522.  
  523.    vbox = gtk_vbox_new(FALSE, 1);
  524.    gtk_widget_show(vbox);
  525.  
  526.    table = gtk_table_new(2, 3, FALSE);
  527.    gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
  528.    gtk_container_set_border_width(GTK_CONTAINER(table), 10);
  529.    gtk_table_set_col_spacings(GTK_TABLE(table), 10);
  530.    gtk_table_set_row_spacings(GTK_TABLE(table), 10);
  531.    gtk_widget_show(table);
  532.  
  533.    create_label_in_table(table, 0, 0, _("Normal:"));
  534.    data->normal_fg = create_color_field(data, table, 0, 1, 
  535.                     (GtkSignalFunc) edit_normal_fg);
  536.    data->normal_bg = create_color_field(data, table, 0, 2,
  537.                     (GtkSignalFunc) edit_normal_bg);
  538.  
  539.    create_label_in_table(table, 1, 0, _("Selected:"));
  540.    data->selected_fg = create_color_field(data, table, 1, 1,
  541.                       (GtkSignalFunc) edit_selected_fg);
  542.    data->selected_bg = create_color_field(data, table, 1, 2,
  543.                       (GtkSignalFunc) edit_selected_bg);
  544.  
  545.    label = gtk_label_new( _("Colors"));
  546.    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
  547. }
  548.  
  549. static void
  550. switch_page(GtkWidget *widget, GtkNotebookPage *page, gint page_num, 
  551.         gpointer data)
  552. {
  553.    if (page_num == 2) {
  554.       PreferencesDialog_t *param = (PreferencesDialog_t*) data;
  555.       set_button_colors(param, ¶m->old_colors);
  556.    }
  557. }
  558.  
  559. static PreferencesDialog_t*
  560. create_preferences_dialog()
  561. {
  562.    PreferencesDialog_t *data = g_new(PreferencesDialog_t, 1);
  563.    DefaultDialog_t *dialog;
  564.    GtkWidget *notebook;
  565.  
  566.    data->color_sel_dlg = NULL;
  567.    data->dialog = dialog = make_default_dialog( _("General Preferences"));
  568.    default_dialog_set_ok_cb(dialog, preferences_ok_cb, (gpointer) data);
  569.    
  570.    data->notebook = notebook = gtk_notebook_new();
  571.    gtk_container_set_border_width(GTK_CONTAINER(notebook), 10);
  572.    gtk_signal_connect_after(GTK_OBJECT(notebook), "switch_page", 
  573.                 GTK_SIGNAL_FUNC(switch_page), (gpointer) data);
  574.  
  575.    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog->dialog)->vbox), 
  576.               notebook, TRUE, TRUE, 10);
  577.    create_general_tab(data, notebook);
  578.    create_menu_tab(data, notebook);
  579.    create_colors_tab(data, notebook);
  580.  
  581.    gtk_widget_show(notebook);
  582.  
  583.    return data;
  584. }
  585.  
  586. void
  587. do_preferences_dialog(void)
  588. {
  589.    static PreferencesDialog_t *dialog;
  590.    PreferencesData_t *old_data;
  591.    GtkWidget *map_type;
  592.  
  593.    if (!dialog) {
  594.       dialog = create_preferences_dialog();
  595.    }
  596.    gtk_notebook_set_page(GTK_NOTEBOOK(dialog->notebook), 0);
  597.    dialog->old_data = old_data = get_preferences();
  598.    dialog->new_colors = dialog->old_colors = old_data->colors;
  599.  
  600.    if (old_data->default_map_type == CERN)
  601.       map_type = dialog->cern;
  602.    else if (old_data->default_map_type == NCSA)
  603.       map_type = dialog->ncsa;
  604.    else
  605.       map_type = dialog->csim;
  606.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(map_type), TRUE);
  607.  
  608.    gtk_toggle_button_set_active(
  609.       GTK_TOGGLE_BUTTON(dialog->prompt_for_area_info),
  610.       old_data->prompt_for_area_info);
  611.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->require_default_url),
  612.                 old_data->require_default_url);
  613.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->show_area_handle),
  614.                 old_data->show_area_handle);
  615.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->keep_circles_round),
  616.                 old_data->keep_circles_round);
  617.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->show_url_tip),
  618.                 old_data->show_url_tip);
  619.    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->use_doublesized),
  620.                 old_data->use_doublesized);
  621.    
  622.    gtk_spin_button_set_value(GTK_SPIN_BUTTON(dialog->undo_levels), 
  623.                  old_data->undo_levels);
  624.    gtk_spin_button_set_value(GTK_SPIN_BUTTON(dialog->mru_size), 
  625.                  old_data->mru_size);
  626.  
  627.    default_dialog_show(dialog->dialog);
  628. }
  629.